#ifndef __DRIVERS_H
#define __DRIVERS_H

#pragma pack(1)

#include "FeedforwardPID.h"
#include "can.h"

#define CAMERA_TARGET_DELAY 486  // 相机目标丢失延迟

/***********************************************************************
 * 两个电机的构建
 *
 */

typedef struct // 收到数据的结构体定义
{
    float Angle;        // 角度
    float Speed;        // 速度
    float Amps;         // 电流
    int8_t temperature; // 温度s
} GM6020_ReceiveDataTypedef;

typedef struct // 电机自身的属性定义
{
    uint8_t ID;                            // 电调号
    int16_t SendDate;                      // 要给CAN发送的数据
    GM6020_ReceiveDataTypedef ReceiveData; // 收到的数据
    FeedForwardPID_TypeDef g_Angle_pid;    // 角度环
    FeedForwardPID_TypeDef g_Speed_pid;    // 速度环
    CAN_HandleTypeDef *useCAN;             // 使用的can线
} MotorTypedef;

typedef struct // 云台包含的电机
{
    MotorTypedef motor1;
    MotorTypedef motor2;
} PlatformTypedef;

extern PlatformTypedef Platform;

/***********************************************************************
 * BMI088的构建
 *
 */

typedef struct
{
    float acc_x;
    float acc_y;
    float acc_z;
    float gyro_x;
    float gyro_y;
    float gyro_z;
    float pitch;
    float yaw;
    float roll;
    float x_error;      //gyro_x产生的零飘值
	float y_error;      //gyro_x产生的零飘
	float z_error;      //gyro_x产生的零飘
} BMI088_ReceiveDataTypedef;

extern BMI088_ReceiveDataTypedef BMI088;


/***********************************************************************
 * 相机USB通讯有关
 *
 */

typedef union // usb接收
{
    float angle;
    uint8_t date[4];
} USB_DataTypedef;

typedef struct
{
    USB_DataTypedef pitch; // 相机中心与装甲板中心pitch
    USB_DataTypedef yaw;   // 相机中心与装甲板中心yaw
	USB_DataTypedef txPitch;
	USB_DataTypedef txYaw;
    uint8_t isReceiveDate;        // 是否接收到数据
    uint8_t isTarget;             // 视野内是否有装甲板
    uint8_t lastIsTarget;         // 上次视野内是否有装甲板
    uint8_t red_or_bule;          // 指导视觉识别红色或蓝色灯条
    uint8_t sendDate[13];          // USB发送的数据
} CameraTypedef;

extern CameraTypedef Camera;

/***********************************************************************
 * Debug参数
 *
 */

typedef struct
{
    uint8_t BMI088_OK : 1;
    uint8_t CAN1_IT_OK : 1;
    uint8_t CAN2_IT_OK : 1;
    uint8_t motor1_ERROR : 1;
    uint8_t motor2_ERROR : 1;
    uint8_t motor1_Edge : 1;
    uint8_t motor2_Edge : 1;
    uint8_t other : 1;
} DebugValueTypedef;

extern DebugValueTypedef DebugValue;

#endif
